home *** CD-ROM | disk | FTP | other *** search
Oberon Text | 1995-12-01 | 8.8 KB | 234 lines | [TEXT/.Ob4] |
- Syntax10.Scn.Fnt
- StampElems
- Alloc
- 1 Dec 95
- ParcElems
- Alloc
- Syntax10b.Scn.Fnt
- Syntax8i.Scn.Fnt
- Syntax10i.Scn.Fnt
- FoldElems
- Syntax10.Scn.Fnt
- "APPL"
- MODULE Directories; (* HM
- IMPORT Sys, Strings, SYSTEM;
- CONST
- noErr* = 0; (**no error*)
- badName* = 1; (**bad file or directory name*)
- mediumFull* = 2; (**disk or directory full*)
- mediumLocked* = 3; (**hardware or software lock*)
- dirInUse* = 4; (**directory in use or not empty*)
- notADir* = 5; (**name does not specify a directory*)
- alreadyExists* = 6; (**directory already exists*)
- otherError* = 7; (**other OS-specific error*)
- delete* = 0; insert* = 1; change* = 2; (** notify operations **)
- delimiter* = ":"; (** delimiter in path names **)
- dirFullErr = -33; dskFullErr = -34; nsvErr = -35; bdNamErr = -37; fnfErr = -43;
- wPrErr = -44; fLckdErr = -45; vLckdErr = -46; fBsyErr = -47; dupFNErr = -48; dirNFErr = -120;
- Directory* = POINTER TO DirectoryDesc;
- DirectoryDesc* = RECORD
- path*: ARRAY 128 OF CHAR;
- spec*: Sys.FSSpec;
- dirID*: LONGINT
- END;
- FileProc* = PROCEDURE (d: Directory; name: ARRAY OF CHAR; isDir: BOOLEAN; VAR continue: BOOLEAN);
- PathProc* = PROCEDURE (path: ARRAY OF CHAR; VAR continue: BOOLEAN);
- CInfoPBDirPtr = POINTER TO CInfoPBDirRec;
- CInfoPBDirRec = RECORD (Sys.CInfoPBRec)
- ioDrUsrWds: Sys.DInfo; (* information used by the Finder *)
- ioDrDirID: LONGINT; (* directory ID *)
- ioDrNmFls: INTEGER; (* number of files in directory *)
- filler3: ARRAY 9 OF INTEGER;
- ioDrCrDat: LONGINT; (* date and time of creation *)
- ioDrMdDat: LONGINT; (* date and time of last modification *)
- ioDrBkDat: LONGINT; (* date and time of last backup *)
- ioDrFndrInfo: Sys.DXInfo; (* additional Finder information *)
- ioDrParID: LONGINT (* directory's parent directory ID *)
- END;
- SearchPath = POINTER TO SearchPathDesc;
- SearchPathDesc = RECORD [Sys.align68K]
- vRefNum: INTEGER;
- dirID: LONGINT;
- next: SearchPath;
- END;
- Notifier* = PROCEDURE (op: INTEGER; path, name: ARRAY OF CHAR);
- (* "paths" must be the first variable in the declaration list. Loader installs path list here *)
- paths: LONGINT;
- res*: INTEGER;
- notify*: Notifier;
- startupPath: ARRAY 128 OF CHAR; (*path containing the Oberon application*)
- PROCEDURE^ Current* (): Directory;
- PROCEDURE StrToArr (VAR str, arr: ARRAY OF CHAR);
- VAR i: INTEGER;
- BEGIN
- FOR i := 1 TO ORD(str[0]) DO arr[i-1] := str[i] END;
- arr[i-1] := 0X
- END StrToArr;
- PROCEDURE ArrToStr (VAR arr, str: ARRAY OF CHAR);
- VAR i: INTEGER;
- BEGIN
- i := 0; WHILE arr[i] # 0X DO str[i+1] := arr[i]; INC(i) END;
- str[0] := CHR(i)
- END ArrToStr;
- PROCEDURE GetPath (v: INTEGER; d: LONGINT; VAR path: ARRAY OF CHAR);
- VAR s: Sys.Str255; res, i, j: INTEGER; spec: Sys.FSSpec; buf: ARRAY 128 OF CHAR;
- BEGIN
- j := 128; s := "";
- REPEAT
- DEC(j); buf[j] := delimiter;
- res := Sys.FSMakeFSSpec(v, d, s, spec);
- FOR i := ORD(spec.name[0]) TO 1 BY -1 DO DEC(j); buf[j] := spec.name[i] END;
- d := spec.parID
- UNTIL d = 1;
- i := 0; WHILE j < 127 DO path[i] := buf[j]; INC(i); INC(j) END;
- path[i] := 0X
- END GetPath;
- PROCEDURE GetParentPath (VAR path: ARRAY OF CHAR);
- VAR i, j: INTEGER;
- BEGIN
- i := 0; j := 0;
- WHILE path[i] # 0X DO
- IF path[i] = delimiter THEN j := i END;
- INC(i)
- END;
- path[j] := 0X
- END GetParentPath;
- PROCEDURE Extend (VAR s, path: ARRAY OF CHAR);
- VAR d: Directory;
- BEGIN
- COPY(s, path);
- IF path[0] = delimiter THEN
- d := Current(); Strings.Insert(d.path, 0, path)
- ELSIF path[0] = "$" THEN
- Strings.Delete(path, 0, 1); Strings.Insert(delimiter, 0, path); Strings.Insert(startupPath, 0, path)
- END Extend;
- PROCEDURE Init;
- VAR d: Directory;
- BEGIN
- d := Current(); COPY(d.path, startupPath)
- END Init;
- PROCEDURE Call (errCode: INTEGER);
- BEGIN
- CASE errCode OF
- noErr: res := noErr
- | fnfErr, nsvErr, bdNamErr, dirNFErr: res := badName
- | dupFNErr: res := alreadyExists
- | dirFullErr, dskFullErr: res := mediumFull
- | wPrErr, fLckdErr, vLckdErr: res := mediumLocked
- | fBsyErr: res := dirInUse
- ELSE res := otherError
- END Call;
- PROCEDURE Current* (): Directory;
- VAR d: Directory; s: Sys.Str255; vRefNum: INTEGER;
- BEGIN
- NEW(d); s := "";
- Call(Sys.HGetVol(SYSTEM.ADR(s), vRefNum, d.dirID)); ASSERT(res = 0);
- GetPath(vRefNum, d.dirID, d.path);
- ArrToStr(d.path, s);
- Call(Sys.FSMakeFSSpec(0, 0, s, d.spec));
- RETURN d
- END Current;
- PROCEDURE This* (path: ARRAY OF CHAR): Directory;
- VAR par: CInfoPBDirRec; s: Sys.Str255; d: Directory;
- BEGIN
- NEW(d); Extend(path, d.path);
- ArrToStr(d.path, s);
- Call(Sys.FSMakeFSSpec(0, 0, s, d.spec));
- IF res = noErr THEN
- par.ioCompletion := 0; par.ioNamePtr := SYSTEM.ADR(s);
- par.ioVRefNum := d.spec.vRefNum; par.ioFDirIndex := 0; par.ioDrDirID := d.spec.parID;
- Call(Sys.PBGetCatInfo(SYSTEM.VAL (Sys.CInfoPBPtr, SYSTEM.ADR(par))));
- IF ODD(par.ioFlAttrib DIV 16) THEN d.dirID := par.ioDrDirID
- ELSE res := notADir; d := NIL
- END
- ELSE d := NIL
- END;
- RETURN d
- END This;
- PROCEDURE Startup* (): Directory;
- BEGIN
- RETURN This(startupPath)
- END Startup;
- PROCEDURE Change* (path: ARRAY OF CHAR);
- VAR s, path0: Sys.Str255;
- BEGIN
- Extend(path, path0); ArrToStr(path0, s);
- Call(Sys.HSetVol(SYSTEM.ADR(s), 0, 0));
- IF res = noErr THEN notify (change, "", "") END
- END Change;
- PROCEDURE Create* (path: ARRAY OF CHAR);
- VAR s, path0: Sys.Str255; name: ARRAY 128 OF CHAR; spec: Sys.FSSpec; dirID: LONGINT;
- BEGIN
- Extend(path, path0); ArrToStr(path0, s);
- Call(Sys.FSMakeFSSpec(0, 0, s, spec));
- IF (res = noErr) OR (res = badName) THEN
- Call(Sys.FSpDirCreate(spec, Sys.smSystemScript, dirID));
- IF res = noErr THEN
- GetParentPath(path0); StrToArr(spec.name, name); notify(insert, path0, name)
- END
- END Create;
- PROCEDURE Delete* (path: ARRAY OF CHAR);
- VAR s, path0: Sys.Str255; spec: Sys.FSSpec; name: ARRAY 128 OF CHAR;
- BEGIN
- Extend(path, path0); ArrToStr(path0, s);
- Call(Sys.FSMakeFSSpec(0, 0, s, spec));
- IF res = noErr THEN Call(Sys.FSpDelete(spec)) END;
- IF res = noErr THEN GetParentPath(path0); StrToArr(spec.name, name); notify(delete, path0, name) END
- END Delete;
- PROCEDURE Rename* (oldPath, newPath: ARRAY OF CHAR);
- VAR s, old, new: Sys.Str255; oldSpec, newSpec, spec: Sys.FSSpec; i: INTEGER;
- oldName, newName: ARRAY 32 OF CHAR;
- result: INTEGER;
- BEGIN
- Extend(oldPath, old); ArrToStr(old, s); GetParentPath(old); Call(Sys.FSMakeFSSpec(0, 0, s, oldSpec));
- IF res = noErr THEN
- Extend(newPath, new); ArrToStr(new, s); GetParentPath(new); Call(Sys.FSMakeFSSpec(0, 0, s, newSpec));
- IF (res = noErr) OR (res = badName) THEN
- IF oldSpec.parID = newSpec.parID THEN
- FOR i := 0 TO ORD(newSpec.name[0]) DO s[i] := newSpec.name[i] END;
- Call(Sys.FSpRename(oldSpec, s))
- ELSE
- ArrToStr(new, s); Call(Sys.FSMakeFSSpec(0, 0, s, spec));
- Call(Sys.FSpCatMove(oldSpec, spec))
- END;
- StrToArr(oldSpec.name, oldName); StrToArr(newSpec.name, newName);
- IF res = noErr THEN result := res; notify(delete, old, oldName); notify(insert, new, newName); res := result END
- END
- END Rename;
- PROCEDURE Enumerate* (d: Directory; proc: FileProc);
- VAR par: Sys.CInfoPBFileRec; i: INTEGER; s: Sys.Str255; name: ARRAY 128 OF CHAR; continue: BOOLEAN; res: INTEGER;
- BEGIN
- continue := TRUE;
- par.ioCompletion := 0; par.ioVRefNum := d.spec.vRefNum;
- i := 1;
- LOOP
- par.ioDirID := d.dirID; par.ioFDirIndex := i; par.ioNamePtr := SYSTEM.ADR(s);
- res := Sys.PBGetCatInfo(SYSTEM.VAL(Sys.CInfoPBFilePtr, SYSTEM.ADR(par)));
- IF res = noErr THEN
- IF par.ioFlFndrInfo.fdType #
- 4150504CH
- THEN
- StrToArr(s, name);
- proc(d, name, ODD(par.ioFlAttrib DIV 16), continue);
- IF ~continue THEN RETURN END
- END;
- INC(i)
- ELSIF res = fnfErr THEN RETURN
- ELSE HALT(20)
- END
- END Enumerate;
- PROCEDURE EnumeratePaths* (proc: PathProc);
- VAR path: ARRAY 256 OF CHAR; continue: BOOLEAN; p: SearchPath;
- BEGIN
- continue := TRUE; p := SYSTEM.VAL (SearchPath, paths);
- WHILE continue & (p # NIL) DO
- GetPath (p.vRefNum, p.dirID, path); proc(path, continue);
- p := p.next
- END EnumeratePaths;
- PROCEDURE NoNotify (op: INTEGER; path, name: ARRAY OF CHAR);
- END NoNotify;
- BEGIN
- notify := NoNotify;
- Init
- END Directories.
-